# coding:utf-8
# TODO: 多进程执行时会产生多份log日志(目前是按照一个进程生成一份log文件)

import logging
from datetime import datetime


class Logger:
    """
    说明：
        通过Log().getLogger 获得定制过的logger
        1. 可通过控制台打印
        2. 也可在log目录中生成log.log日志文件
    """

    def __call__(self, projectdir=" ", loggingformat=" ", logginglevel=" "):
        """
        描述：
        :param projectdir: 
        :param loggingformat: 
        :param logginglevel: 
        :return: 
        示例：
            logger = Logger()(projectdir=" ", loggingformat=" ", logginglevel=" ")
            logger.info("msg")
        """
        self.projectdir = projectdir
        self.loggingformat = loggingformat
        self.logginglevel = logginglevel
        return self.__setAndReturnLogger()

    def __setAndReturnLogger(self):
        logger = logging.getLogger()
        # 由于重复调用logging.getLogger()会产生多个相同名称的logger(名称为root)，handler数量会一直累加，导致重复记录日志因此这里需要判断处理。
        if not logger.handlers:
            # 设置Handler选择日志输出方式
            time = datetime.now().strftime("%Y%m%d_%H%M%S")
            fh = logging.FileHandler(
                filename=(self.projectdir + "\\log\\log_" + time + ".log"),
                encoding="utf-8",
            )  # 文件输出
            ch = logging.StreamHandler() # 控制台输出
            # Handler添加输出格式
            format = logging.Formatter(self.loggingformat)
            fh.setFormatter(format)
            ch.setFormatter(format)
            # 添加Handler
            logger.addHandler(fh)
            logger.addHandler(ch)
        # 设置日志输出级别
        logger.setLevel(self.logginglevel)

        return logger

    # @property
    # def getLogger(self):
    #     """
    #     调用方式二
    #     logger = Logger().getLogger
    #     logger.info("msg")
    #     """
    #     return self.__setAndReturnLogger()
